Kurt Hsu's blog

The Rails developer in taiwan.


  • 首頁

  • 標籤

  • 分類

  • 歸檔

[Rails]淺談Strong parameters機制

發表於 2018-04-10 更新於 2019-08-21 分類於 Rails

起源為防止massive-assignment問題

在Rails有個便利的機制是將表單送出之後透過massive-assignment 的技巧直接 mapping 進 Model 裡

例如在一個簡單的表單

index.html.erb
1
2
3
4
5
<%= form_for @post do |f| %>
<%= f.text_field :title %>
<%= f.text_area :content %>
<%= f.sumbit "Submit" %>
<% end %>

在controller裡的create

post_controller.js
1
2
3
4
5
6
7
8
9
10
class PostController < ApplicationController
def create
@post = current_user.posts.build(params[:post])
if @post.save
# do something
else
# do another thing
end
end
end

就可以直接成立,但如果有心人士在DOM裡面加了額外參數並且猜對了就可以做到超出權限以外的事情,最直接的就是猜中了user 權限是用 user.is_admin 作為 boolean 值,然後直接讓自己有了admin的權限。

Rails 4 有了Strong Parameters的機制

在Rails 3 裡面其實也可以手動做簡單的防護機制,但大多人嫌麻煩或者較沒經驗的開發者沒有這個觀念,這個防護機制在許多中小型網站是被忽略掉的,自從Github被Hack了之後Rails團隊把這個機制改為必定要做了!

現在我們的params都要遵守Strong Parameters機制寫成如下

post_controller.js
1
2
3
4
5
6
7
8
9
10
11
12
def create
@event = Event.new(event_params)
@event.save

redirect_to :action => :index
end

private

def event_params
params.require(:event).permit(:name, :description)
end

其中:

  1. require會把:post這個model相關的參數給抓出來,如果根本沒有回傳:post相關參數,就會產生錯誤訊息。
  2. permit就是設定有哪些參數可以傳入,例如上面沒有寫參數,就算你從http request當中傳入,也會回傳nil當做沒東西。

從今以後外人想利用修改DOM把post出去的東西亂加料就會被過濾掉了!

參考文章:
從 Github 被 hack,談 Rails 的安全性( mass-assignment )
Rails實戰聖經
Rails 當中的 params 是什麼?

# Rails
[Rails]實作套入Bootstrap&認識Asset Pipeline
[Rails]簡單的掌握Routes
  • 文章目錄
  • 本站概要

Kurt Hsu

Progress One Percent Every Day
171 文章
55 分類
163 標籤
RSS
  1. 1. 起源為防止massive-assignment問題
  2. 2. Rails 4 有了Strong Parameters的機制
© 2020 Kurt Hsu
由 Hexo 強力驅動 v3.8.0
|
主題 – NexT.Muse v7.3.0